#ifndef _WX_URL_H
#define _WX_URL_H

#include "wx/defs.h"
#include "wx/uri.h"
#include "wx/protocol/protocol.h"

#if wxUSE_PROTOCOL_HTTP
#include "wx/protocol/http.h"
#endif

typedef enum {
  wxURL_NOERR = 0,
  wxURL_SNTXERR,
  wxURL_NOPROTO,
  wxURL_NOHOST,
  wxURL_NOPATH,
  wxURL_CONNERR,
  wxURL_PROTOERR
} wxURLError;

class wxURL;

class wxURLNativeImp : public wxObject {
  public:
    virtual ~wxURLNativeImp() { }
    virtual wxInputStream *GetInputStream( wxURL *owner ) = 0;
};

class wxURL : public wxURI {
  public:
    wxURL( const wxString& sUrl = wxEmptyString );
    wxURL( const wxURI& url );
    virtual ~wxURL();

    wxURL& operator = ( const wxString& url );
    wxURL& operator = ( const wxURI& url );

    wxProtocol& GetProtocol()        { return *m_protocol; }
    wxURLError GetError() const      { return m_error; }
    wxString GetURL() const          { return m_url; }

    wxURLError SetURL( const wxString &url ) { *this = url; return m_error; }

    bool IsOk() const
    { return m_error == wxURL_NOERR; }

    wxInputStream *GetInputStream();

    #if wxUSE_PROTOCOL_HTTP
    static void SetDefaultProxy( const wxString& url_proxy );
    void SetProxy( const wxString& url_proxy );
    #endif // wxUSE_PROTOCOL_HTTP

  protected:
    static wxProtoInfo *ms_protocols;

    #if wxUSE_PROTOCOL_HTTP
    static wxHTTP *ms_proxyDefault;
    static bool ms_useDefaultProxy;
    wxHTTP *m_proxy;
    #endif // wxUSE_PROTOCOL_HTTP

    wxProtoInfo *m_protoinfo;
    wxProtocol *m_protocol;

    wxURLError m_error;
    wxString m_url;
    bool m_useProxy;

    void Init( const wxString& );
    bool ParseURL();
    void CleanData();
    bool FetchProtocol();

    friend class wxProtoInfo;
    friend class wxURLModule;

  private:
    DECLARE_DYNAMIC_CLASS( wxURL )
};

#endif
